package br.uniceub.fsw.talentos.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.talentos.vo.HabilidadeVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * Data Access Object da entidade Habilidade. Essa classe é responsável por todas as 
 * operações de banco de dados relacionadas à entidade.
 * 
 @author   Bruno Henrique Sousa do Val 2046369/2
 *         
 */
public class HabilidadeDAO extends BaseDAO<HabilidadeVO> {

    @Override
    public void inserir(HabilidadeVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TB_HABILIDADE(NO_HABILIDADE, CD_TIPOHABILIDADE)");
        query.append("VALUES (?, ?)");

        List<?> parametros = criarParametros(entidade.getNoHabilidade(), entidade.getCdTipoHabilidade());

        Integer idGerado = ((Long) executarInsercao(query.toString(), parametros)).intValue();

        entidade.setIdHabilidade(idGerado);
    }

    @Override
    public void alterar(HabilidadeVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TB_HABILIDADE SET NO_HABILIDADE = ?,");
        query.append("CD_TIPOHABILIDADE = ?");
        query.append("WHERE ID_HABILIDADE = ?");

        List<?> parametros = criarParametros(entidade.getNoHabilidade(), 
                entidade.getCdTipoHabilidade(), entidade.getIdHabilidade());

        executarAlteracao(query.toString(), parametros);
    }

    @Override
    public void excluir(HabilidadeVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TB_HABILIDADE");
        query.append("WHERE ID_HABILIDADE = ?");

        executarAlteracao(query.toString(), criarParametros(entidade.getIdHabilidade()));
    }

    @Override
    public HabilidadeVO consultarPorId(Serializable id) {

        HabilidadeVO ativo = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_HABILIDADE T WHERE T.ID_HABILIDADE = ?");

        ativo = consultarUm(query.toString(), criarParametros(id));

        return ativo;
    }

    @Override
    public List<HabilidadeVO> consultarPorExemplo(HabilidadeVO exemplo) {

        List<HabilidadeVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_HABILIDADE T WHERE 1=1");

        mapearQueryParaExemplo(query, exemplo);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }

    public List<HabilidadeVO> consultarHabilidadesPorTipoOrdenadoPorNome(Integer idTipoHabilidade) {
        List<HabilidadeVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_HABILIDADE T WHERE T.CD_TIPOHABILIDADE = ? ORDER BY T.NO_HABILIDADE");

        listaRetorno = consultar(query.toString(), criarParametros(idTipoHabilidade));

        return listaRetorno;
    }
    
    public List<HabilidadeVO> consultarHabilidadesPorTalento(Integer cdTalento) {
        List<HabilidadeVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT *");
        query.append("FROM TB_HABILIDADE T, TB_CAPACITACAO C");
        query.append("WHERE C.CD_TALENTO = ?");
        query.append("AND T.ID_HABILIDADE = C.CD_HABILIDADE");
        query.append("ORDER BY T.NO_HABILIDADE");

        listaRetorno = consultar(query.toString(), criarParametros(cdTalento));

        return listaRetorno;
    }    
    
    @Override
    protected HabilidadeVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        HabilidadeVO ativo = new HabilidadeVO();
        
        ativo.setIdHabilidade(rs.getInt("ID_HABILIDADE"));
        ativo.setNoHabilidade(rs.getString("NO_HABILIDADE"));
        ativo.setCdTipoHabilidade(new Integer(rs.getInt("CD_TIPOHABILIDADE")));

        return ativo;
    }

    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, HabilidadeVO exemplo) {

        if (exemplo.getNoHabilidade() != null && exemplo.getNoHabilidade().trim().length() > 0) {
            query.append("AND T.NO_HABILIDADE LIKE ?");
            adicionarParametro("%" + exemplo.getNoHabilidade() + "%");
        }
        if (exemplo.getCdTipoHabilidade() != null) {
            query.append("AND T.CD_TIPOHABILIDADE = ?");
            adicionarParametro(exemplo.getCdTipoHabilidade());
        }
    }
}